'use strict'

const fs = require('fs')

// 检测路径是否存在,是否有权限写入
function checkPath(path) {
  return new Promise((resolve, reject) => {
    fs.access(path, fs.constants.W_OK, err => {
      if (err) {
        if (err.code === 'ENOENT') {
          resolve(false)
        } else {
          reject(Error('没有权限'))
        }
      } else {
        resolve(true)
      }
    })
  })
}

// 创建文件夹(递归)
function createDir(path) {
  return new Promise((resolve, reject) => {
    fs.mkdir(path, { recursive: true }, err => {
      if (err) {
        reject(err)
      } else {
        resolve()
      }
    })
  })
}

// 检测是否为文件夹
function checkDir(path) {
  return new Promise((resolve, reject) => {
    fs.stat(path, (err, stats) => {
      if (err) {
        reject(err)
      } else {
        const isDir = stats.isDirectory()
        if (isDir) {
          resolve()
        } else {
          reject(Error('不是文件夹'))
        }
      }
    })
  })
}

// 根据指定路径返回文件夹路径(不存在则创建)
async function accessDir(path = null) {
  try {
    const isValidPath = await checkPath(path)
    if (!isValidPath) {
      await createDir(path)
    }
    await checkDir(path)
    return path
  } catch (err) {
    return Promise.reject(err)
  }
}

module.exports = accessDir
